<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="z5ov8" id="z5ov8"><span data-lake-id="u5a08babf" id="u5a08babf">典型回答</span></h1>
  <p data-lake-id="u071846c7" id="u071846c7"><br></p>
  <p data-lake-id="u926e9aad" id="u926e9aad"><span data-lake-id="u11ffb2a0" id="u11ffb2a0">RabbitMQ的消息消费是有确认机制的，正常情况下，消费者在消息消费成功后，会发送一个确认消息，消息队列接收到之后，就会将该消息从消息队列中删除，下次也就不会再投递了。</span></p>
  <p data-lake-id="u27f0db69" id="u27f0db69"><span data-lake-id="ua0c5b23c" id="ua0c5b23c">​</span><br></p>
  <p data-lake-id="u3fec420d" id="u3fec420d"><span data-lake-id="uc38f79a8" id="uc38f79a8">但是如果存在网络延迟的问题，导致确认消息没有发送到消息队列，导致消息重投了，是有可能，所以，当我们使用MQ的时候，消费者端自己也需要做好幂等控制来防止消息被重复消费。</span></p>
  <p data-lake-id="u1731a762" id="u1731a762"><span data-lake-id="u1d50d4d6" id="u1d50d4d6">​</span><br></p>
  <p data-lake-id="ub069c35a" id="ub069c35a"><span data-lake-id="u9b195c5b" id="u9b195c5b">一般来说，处理这种幂等问题就是我们提过无数次的'一锁、二判、三更新'</span></p>
  <p data-lake-id="u6a36df7a" id="u6a36df7a"><span data-lake-id="u00b7a3d5" id="u00b7a3d5">​</span><br></p>
  <p data-lake-id="u33c67d5e" id="u33c67d5e"><br></p>
  <p data-lake-id="u97b9ba5e" id="u97b9ba5e"><span data-lake-id="ua7a22e19" id="ua7a22e19">也就是说我们在发送消息是需要生成一个唯一的标识并且把它放到消息体中，根据这个标识就可以判断两次消息是不是同一条。这样我们在消费者端，接收到消息以后，只需要解析出消息体中的这个唯一标识，就可以通过'一锁、二判、三更新'的方式来判断是否消费成功过了。</span></p>
 </body>
</html>